草庐IT

Android ArrayList迭代

全部标签

c++ - 迭代不断变化的容器

我正在迭代一组回调函数。函数在迭代期间被调用,可能会导致函数集的实际容器发生剧烈变化。我现在做的是:制作原始集的拷贝遍历拷贝,但对于每个元素检查它是否仍然存在于原始集合中检查每个元素的存在是super动态的,但看起来也很慢。是否有其他建议来解决这个问题?编辑:这里是实际的代码://=>i=eventidtemplatevoiddispatchEvent(inti,Paramparam){EventReceiverSetprocessingNow;constEventReceiverSet&eventReceiverSet=eventReceiverSets[i];std::copy(e

c++ - 递增可变输入迭代器是否会使旧迭代器值无效?

Iteratorsthatfurthersatisfytherequirementsofoutputiteratorsarecalledmutableiterators.Nonmutableiteratorsarereferredtoasconstantiterators.[24.2.1:4]这表明您可以拥有一个可变输入迭代器,它满足输入和输出迭代器的要求。递增输入迭代器后,其旧值的拷贝不需要解引用[24.2.3]。然而,标准并没有对输出迭代器说同样的话;事实上,后缀增量的操作语义为{Xtmp=r;++r;返回tmp;},表明输出迭代器可能不会使旧迭代器值(的拷贝)无效。那么,递增可变

c++ - O(logn) 中 std::set begin() 和 std::set 迭代器之间的距离

我需要在std::set中找到一个元素的索引。该索引可以可视化为迭代器距起点的距离。一种方法可以是:for(inti=0,set::iteratorit=s.begin();it!=iteratorToBeFound;++it,++i);这显然需要O(n)的时间。但是我们知道,set内部实现的二叉搜索树到根的距离可以在O(logn)时间内找到。他们有什么方法可以实现在C++集合中以O(logn)时间查找索引吗? 最佳答案 您可以使用函数std::set::find搜索元素x并计算distance到集合的第一个迭代器。std::dis

c++ - 如何将访问者界面适配为迭代器界面?

我想知道是否有一个好的设计模式或成语来实现以下内容:Youhaveanexistingclassthatprovidesonlyavisitorinterface,asfollowsclassVisitor{public:virtual~Visitor(){}virtualvoidvisit(Node*n)=0;};classTree{public:voidaccept(Visitor*v);};Andyouwanttohaveaninterfacethatcanbeusedasfollows,whichshoulditeratethroughthetreeinthesameorder

c++ - std::upper_bound 在 const 成员函数中返回 const 迭代器

这是一个类,其中包含一些struct的boost::circular_buffer。我为包含的circular_buffer中的迭代器创建了一个typedef。我的问题是:当doWork函数被标记为const时,std::upper_bound的返回值与MyIterator类型,因为返回值具有boost::cb_details::const_traits。如果我从函数中删除const关键字,我所有的编译错误都会消失。要明确编译器错误是这样的:error:conversionfrom‘boost::cb_details::iterator::Sample,std::allocator::

c++ - 在 for range 循环中迭代包含 vector 的取消引用的 unique_ptr

为什么这段代码不像我想象的那样工作?for(autoit:*std::make_unique>(std::vector({1,2,3,4,5})))std::coutvector对象在执行循环的第一次迭代之前被销毁 最佳答案 range-basedforloop相当于:{init-statementauto&&__range=range_expression;...}对于您的range_expression,它将是auto&&__range=*std::make_unique>(std::vector({1,2,3,4,5}));但

c++ - 启用S​​TL迭代器调试的真正作用是什么?

我已经通过定义在应用程序中启用了迭代器调试_HAS_ITERATOR_DEBUGGING=1我原以为这实际上只是检查vector范围,但我感觉它的作用远不止于此。实际上正在执行哪些检查等?顺便说一下,DinkumwareSTL。 最佳答案 迭代器有许多操作会导致未定义的行为,此触发器的目标是激活运行时检查以防止它发生(使用断言)。问题显而易见的操作是使用无效的迭代器,但是这种无效可能是由于多种原因引起的:未初始化的迭代器迭代器到已删除的元素迭代器,该元素的物理位置已更改(vector的重新分配)[begin,end)之外的迭代器该标

c++ - 基于指针的基本随机访问迭代器的代码?

我从未实现过类似STL的迭代器,我试图理解如何基于指针实现一个非常基本的东西。一旦我有了这个类,我就可以修改它来做更复杂的事情。因此,这是第一步,我需要它坚如磐石才能理解如何编写我自己的迭代器(不使用boost)。我写了下面的代码,我知道里面有错误。你能帮我正确设计一个受此启发的随机访问迭代器类吗:templateclassContainer::Iterator:publicstd::iterator{//Lifecycle:public:Iterator():_ptr(nullptr){;}Iterator(Type*rhs):_ptr(rhs){;}Iterator(constIt

c++ - 为什么在隐式共享容器上使用迭代器时必须先复制?

Qt的文档说明如下:Thankstoimplicitsharing,itisveryinexpensiveforafunctiontoreturnacontainerpervalue.TheQtAPIcontainsdozensoffunctionsthatreturnaQListorQStringListpervalue(e.g.,QSplitter::sizes()).IfyouwanttoiterateovertheseusinganSTLiterator,youshouldalwaystakeacopyofthecontaineranditerateoverthecopy.Fo

c++ - 在 C++ 中,为什么我们不能使用 > 和 < 来比较迭代器?

这个问题在这里已经有了答案:Whyis"!="usedwithiteratorsinsteadof"(2个答案)关闭6年前。有人问我这个问题,我真的不知道为什么。如果你有一个指针int*x;您可以将指针与>进行比较和因为它代表内存位置,类似于0x00000x00040x0008等。我知道迭代器和指针是不同的,但它们的行为方式非常相似。例如:vectormyVector;for(inti=1;i::iteratorit=myVector.begin();while(it!=myVector.end())//Whycan'twewriteit为什么我们不能写它在while陈述?我知道这与S